package in.lib.handler.streams; import in.lib.adapter.PostAdapter; import in.lib.adapter.base.RobinAdapter.Order; import in.lib.exception.ExceptionHandler; import in.lib.handler.base.PostStreamResponseHandler; import in.lib.thread.StreamFragmentRunnable; import in.model.Post; import in.rob.client.R; import in.rob.client.page.ThreadPage; import android.content.Context; import android.text.TextUtils; import android.view.View; public class ThreadResponseHandler extends PostStreamResponseHandler { private String currentPostId = ""; public ThreadResponseHandler(Context c) { super(c, false); setFailMessage(c.getString(R.string.thread_stream_fail)); } @Override public void onCallback() { if (getFragment() != null) { getFragment().runOnUiThread(responseRunner); } if (getFragment() != null) { getFragment().extractUsersAndTags(getObjects()); } } private StreamFragmentRunnable responseRunner = new StreamFragmentRunnable() { @Override public ThreadPage getFragment() { return (ThreadPage)super.getFragment(); } @Override public void run() { if (getFragment() != null) { try { getFragment().getRefreshHelper().finish(); getFragment().getHeadedListView().setBlockLayoutChildren(true); boolean initial = getFragment().getAdapter().getCount() <= 1; int pos = getFragment().getListView().getFirstVisiblePosition(); ((PostAdapter)getFragment().getAdapter()).setAnimationsEnabled(false); currentPostId = getFragment().getAdapter().getItem(pos) != null ? getFragment().getAdapter().getItem(pos).getId() : ""; if (TextUtils.isEmpty(currentPostId)) { if (getFragment().getCenterPost() != null) { currentPostId = getFragment().getCenterPost().getId(); } else if (!TextUtils.isEmpty(getFragment().getThreadId())) { currentPostId = getFragment().getThreadId(); } } // get the selected post's position so we can reposition the list // after loading the extra replies. We have to go backwards because // we are eventually reversing the list int postCount = getObjects().size(); for (int index = postCount - 1, arrayIndex = 0; index > -1; index--, arrayIndex++) { Post p = (Post)getObjects().get(index); p.setMention(false); if (getFragment().getCenterPost() != null && p.getId().equals(getFragment().getCenterPost().getId())) { getFragment().setCenterPost(p); } if (p.getId().equals(currentPostId)) { pos = arrayIndex + (initial ? getFragment().getListView().getHeaderViewsCount() : 0); } } if (((PostAdapter)getFragment().getAdapter()).getCenter() == null && getFragment().getCenterPost() == null) { ((PostAdapter)getFragment().getAdapter()).setCenter((Post)getObjects().get(getObjects().size() - 1)); } else { ((PostAdapter)getFragment().getAdapter()).setCenter(getFragment().getCenterPost()); } View v = getFragment().getListView().getChildAt(0); int top = (v == null) ? 0 : v.getTop(); getFragment().getAdapter().setOrder(Order.ASC); getFragment().getAdapter().setItems(getObjects()); ((PostAdapter)getFragment().getAdapter()).setReady(true); getFragment().registerPositionReset(pos, top); getFragment().getAdapter().setHasMore(getHasMore()); getFragment().getAdapter().setStreamMarker(getMarker()); setFinishedLoading(false); } catch (Exception e) { ExceptionHandler.sendException(e); } } super.run(); } }; }